﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entities;
using System.Transactions;

namespace BLL
{
	public class QLMayTinh
	{
		/// <summary>
		/// Lấy tất cả máy tính
		/// </summary>
		public static IEnumerable<MayTinh> GetAll()
		{
			return Generic.GetAll<MayTinh>();
		}

		/// <summary>
		/// Thêm máy tính
		/// </summary>
		

		/// <summary>
		/// Xóa máy tính
		/// </summary>
		public static int Delete(MayTinh mt)
		{
			return Generic.DeleteByCondition<MayTinh>(mt1 => mt1.MaMT == mt.MaMT);
		}

		/// <summary>
		/// Xóa tất cả máy tính
		/// </summary>
		public static int DeleteAll(IEnumerable<MayTinh> ps)
		{
			return Generic.DeleteByCondition<MayTinh>(mt => ps.Where(x => x.MaMT == mt.MaMT).Count() == 1);
		}

		/// <summary>
		/// Xóa máy tính theo thuộc tính
		/// </summary>
		public static bool DeleteByID(int mamt)
		{
			return Generic.DeleteByCondition<DeXuat>(x => x.MaDX == mamt) > 0;

		}

		/// <summary>
		/// Cập nhật máy tính
		/// </summary>
		public static ActionResult Update(ThietBi tb,MayTinh mt)
		{
            ActionResult kq=new ActionResult("cập nhật máy tính");
            kq.Exceptions.AddRange(QLThietBi.Update(tb).Exceptions);
            kq.Exceptions.AddRange(Validate(mt).Messages.Select(x=>new Exception(x)));
            if (kq.Success)
            {
                try
                {
                    Generic.EditByCondition<MayTinh>(k => k.MaMT == mt.MaMT, k =>
                      {
                          k.MaMT = mt.MaMT;
                      });
                }
                catch (Exception ex)
                {
                    kq.Exceptions.Add(ex);
                }
            }
            return kq;
		}

		/// <summary>
		/// Tìm máy tính theo điều kiện
		/// </summary>
		public static IEnumerable<MayTinh> FindByCondition(Func<MayTinh, bool> func)
		{
			return Generic.FindByCondition<MayTinh>(func);
		}
        public static MayTinh FindByMaTB(string matb)
        {
            IEnumerable<MayTinh> mt = Generic.FindByCondition<MayTinh>(x => x.MaTB == matb);
            return mt.Count()>0?mt.First():null;
        }
        public static ValidationResult Validate(MayTinh mt)
        {
            ValidationResult kq = new ValidationResult();
            if (mt.MaMT == "")
            {
                kq.Messages.Add("mã máy tính phải khác rỗng !");
            }
            if(QLMayTinh.FindByCondition(x=>x.MaMT==mt.MaMT).Count()>0)
            {
                kq.Messages.Add("mã máy tính đã tồn tại !");
            }
            return kq;
        }
        static ActionResult Insert(MayTinh mt)
        {
            ActionResult kq = new ActionResult();
            kq.Exceptions.AddRange(Validate(mt).Messages.Select(x=>new Exception(x)));
            if (kq.Success)
            {
                try
                {
                    Generic.Insert<MayTinh>(mt);
                }
                catch (Exception ex)
                {
                    kq.Exceptions.Add(ex);
                }
            }
            return kq;
        }
        public static ActionResult InsertMT(ThietBi tb, MayTinh mt, List<PhanCung> dsphancung)
        {
            ActionResult kq = new ActionResult("Thêm Máy Tính");

            using (var transaction = new TransactionScope())
            {
                kq.Exceptions.AddRange(QLThietBi.InsertTB(tb).Exceptions);
                if (kq.Success)
                {
                    kq.Exceptions.AddRange(Insert(mt).Exceptions);
                }
                if (kq.Success)
                {
                    kq.Exceptions.AddRange(QLPhanCung.ThemDsPhanCung(dsphancung).Exceptions);
                }
                if (kq.Success)
                {
                    transaction.Complete();
                }
                else
                {
                    transaction.Dispose();
                }
                Generic.Reconnect();
            }
            return kq;
        }
	}
}
